package com.example.rwq_test.threadLocal.sdf;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 执行结果:
 *  IntegerThreadLocal value: 1
 *  IntegerThreadLocal value: 2
 *  Task 0 executed by thread: Thread-1:null
 *  IntegerThreadLocal value: 3
 *  IntegerThreadLocal value: 4
 *  Task 2 executed by thread: Thread-3:null
 *  Task 1 executed by thread: Thread-2:null
 *
 * 线程池submit run 和execute有神魔区别？为神魔execute中拿不到线程的threadlocal?
 *  1.  submit() 方法接受 Callable 或 Runnable 任务，并返回一个 Future 对象，可以用来获取任务执行的结果或处理异常。
 *  2.  execute() 方法只接受 Runnable 任务，没有返回值。
 * 关于为什么在 execute() 方法中无法直接访问线程的 ThreadLocal 值，这是因为 execute() 方法是 Executor 接口中定义的方法，而 Executor 接口并没有提供访问线程的方法。而 submit() 方法返回的 Future 对象可以通过 FutureTask 的 get() 方法来获取任务执行的结果，这样就可以间接地访问线程的 ThreadLocal 值。
 * 如果您需要在 execute() 方法中访问线程的 ThreadLocal 值，一种方法是在任务执行之前将 ThreadLocal 值传递给 Runnable 任务，另一种方法是使用 submit() 方法提交任务。
 *
 * @author renweiqiang
 * @version 1.0.0
 * @createTime 2024/4/12
 */
public class MySDFThreadLocalMain {
    public static void main(String[] args) throws InterruptedException {
        MySDFThreadFactory sdfThreadFactory = new MySDFThreadFactory();
        // 创建一个线程池，并使用IntegerThreadFactory作为线程工厂
        ThreadPoolExecutor executorService = new ThreadPoolExecutor(3, 5, 10,
                TimeUnit.SECONDS, new LinkedBlockingQueue<>(7),
                sdfThreadFactory , new ThreadPoolExecutor.AbortPolicy());

        for (int i = 0; i < 20; i++) {
            // 提交任务给线程池执行
            executorService.submit(new MySDFTask(i));
        }
        TimeUnit.SECONDS.sleep(20);
        // 关闭线程池
        executorService.shutdown();
    }
}
